"""
RFQ状态管理模块

该模块实现了RFQ系统的状态机，用于管理系统运行的不同状态。
采用状态模式设计，定义了系统运行过程中的各个状态及其转换逻辑。

状态定义：
1. 空闲状态 (IdleState)：系统待机状态
2. 初始化状态 (InitializingState)：系统启动和初始化
3. 运行状态 (RunningState)：正常运行和功率控制
4. 错误状态 (ErrorState)：异常情况处理

状态转换逻辑：
- 空闲 -> 初始化：满足运行条件时
- 初始化 -> 运行：初始化完成时
- 运行 -> 错误：运行条件不满足时
- 错误 -> 空闲：错误解决时

使用示例：
    state = IdleState(controller)
    next_state = state.update()
"""

from abc import ABC, abstractmethod
from typing import Optional
from datetime import datetime

class RFQState(ABC):
    """
    RFQ状态基类
    
    定义了状态机中所有状态的基本接口，包括：
    1. 状态进入操作
    2. 状态退出操作
    3. 状态更新和转换逻辑
    
    属性：
        controller: RFQ控制器实例，用于访问系统状态和控制功能
    
    方法：
        enter(): 进入状态时的操作
        exit(): 退出状态时的操作
        update(): 更新状态并决定是否转换到下一个状态
    """
    
    def __init__(self, controller):
        """
        初始化状态
        
        Args:
            controller: RFQ控制器实例
        """
        self.controller = controller
        
    @abstractmethod
    def enter(self) -> None:
        """
        进入状态时的操作
        
        在状态转换到当前状态时调用，用于执行状态特定的初始化操作
        """
        pass
        
    @abstractmethod
    def exit(self) -> None:
        """
        退出状态时的操作
        
        在状态转换离开当前状态时调用，用于执行清理操作
        """
        pass
        
    @abstractmethod
    def update(self) -> Optional['RFQState']:
        """
        更新状态
        
        Returns:
            Optional[RFQState]: 下一个状态，如果不需要转换则返回None
        """
        pass

class IdleState(RFQState):
    """
    空闲状态
    
    系统待机状态，等待启动条件满足。
    主要功能：
    1. 监控系统条件
    2. 在条件满足时转换到初始化状态
    """
    
    def enter(self) -> None:
        """进入空闲状态，记录状态转换时间"""
        print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}: 进入空闲状态")
        
    def exit(self) -> None:
        """退出空闲状态，无需特殊操作"""
        pass
        
    def update(self) -> Optional[RFQState]:
        """
        检查系统条件，决定是否转换到初始化状态
        
        Returns:
            Optional[RFQState]: 如果条件满足返回InitializingState，否则返回None
        """
        if self.controller.check_conditions():
            return InitializingState(self.controller)
        return None

class InitializingState(RFQState):
    """
    初始化状态
    
    系统启动和初始化阶段，负责：
    1. 初始化LLRF系统
    2. 检查初始化完成条件
    3. 在初始化完成后转换到运行状态
    """
    
    def enter(self) -> None:
        """进入初始化状态，开始系统初始化"""
        print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}: 开始初始化")
        self.controller.init_llrf()
        
    def exit(self) -> None:
        """退出初始化状态，无需特殊操作"""
        pass
        
    def update(self) -> Optional[RFQState]:
        """
        检查初始化状态，决定是否转换到运行状态
        
        Returns:
            Optional[RFQState]: 如果初始化完成返回RunningState，否则返回None
        """
        if self.controller.is_initialized():
            return RunningState(self.controller)
        return None

class RunningState(RFQState):
    """
    运行状态
    
    系统正常运行阶段，负责：
    1. 执行自动功率加载
    2. 监控系统运行条件
    3. 在条件不满足时转换到错误状态
    """
    
    def enter(self) -> None:
        """进入运行状态，记录状态转换时间"""
        print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}: 进入运行状态")
        
    def exit(self) -> None:
        """退出运行状态，无需特殊操作"""
        pass
        
    def update(self) -> Optional[RFQState]:
        """
        执行运行状态操作，检查是否需要转换到错误状态
        
        Returns:
            Optional[RFQState]: 如果条件不满足返回ErrorState，否则返回None
        """
        if not self.controller.check_conditions():
            return ErrorState(self.controller)
        self.controller.auto_load()
        return None

class ErrorState(RFQState):
    """
    错误状态
    
    系统异常处理阶段，负责：
    1. 记录错误状态
    2. 监控错误解决条件
    3. 在错误解决后转换到空闲状态
    """
    
    def enter(self) -> None:
        """进入错误状态，记录状态转换时间"""
        print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}: 进入错误状态")
        
    def exit(self) -> None:
        """退出错误状态，无需特殊操作"""
        pass
        
    def update(self) -> Optional[RFQState]:
        """
        检查错误是否解决，决定是否转换到空闲状态
        
        Returns:
            Optional[RFQState]: 如果错误解决返回IdleState，否则返回None
        """
        if self.controller.check_error_resolved():
            return IdleState(self.controller)
        return None 